参考博客:https://www.cnblogs.com/happy4java/p/11206105.html
/**
* 枚举类实现单例模式,保证单一性和线程安全
* @author DELL
*
*/
public enum Singleton1 {
/**
* 单例变量
*/
INSTANCE;
public void doSomething() {
System.out.println("do something ...");
}
/**
* 程序入口
* @param args
*/
public static void main(String[] args) {
Singleton1.INSTANCE.doSomething();
}
}
/**
* 饥汉模式
* @author DELL
*
*/
public class Singleton2 {
/**
* 初始化直接创建单例
*/
private static final Singleton2 instance = new Singleton2();
/**
* 构造器私有化
*/
private Singleton2() {
}
/**
* 获取单例接口
* @return
*/
public static Singleton2 getInstance() {
return instance;
}
/**
* 程序入口
* @param args
*/
public static void main(String[] args) {
System.out.println(Singleton2.getInstance().hashCode());
System.out.println(Singleton2.getInstance().hashCode());
}
}
Runtime类
/**
* 懒汉模式
* @author DELL
*
*/
public class Singleton3 {
/**
* 初始化不创建单例
*/
private static volatile Singleton3 instance;
/**
* 构造器私有化
*/
private Singleton3() {
}
/**
* 获取单例接口,双重检查加锁,保证线程安全
* @return
*/
public static Singleton3 getInstance() {
if(null == instance) {
synchronized (Singleton3.class) {
if(null == instance) {
instance = new Singleton3();
}
}
}
return instance;
}
/**
* 程序入口
* @param args
*/
public static void main(String[] args) {
System.out.println(Singleton3.getInstance().hashCode());
System.out.println(Singleton3.getInstance().hashCode());
}
}
/**
* 静态内部类实现单例
* @author DELL
*
*/
public class Singleton4 {
/**
* 静态内部类只会初始化一次,线程安全懒加载
* @author DELL
*
*/
public static class Inner{
/**
* 单例对象初始化放到静态内部类中
*/
private static Singleton4 instance = new Singleton4();
}
/**
* 构造器私有化
*/
private Singleton4(){
}
/**
* 获取单例对象
* @return
*/
public Singleton4 getInstance() {
return Inner.instance;
}
/**
* 程序入口
* @param args
*/
public static void main(String[] args) {
System.out.println(Inner.instance);
}
}
按照不同策略给Dog对象排序,sort方法传入不同比较器即可
策略1使用匿名内部类实现Comparator接口创建对象
策略2使用lambda表达式实现Comparator接口创建对象
策略3使用lambda表达式实现Comparator接口创建对象
import java.util.Arrays;
import java.util.Comparator;
public class Strategy {
public static void main(String[] args) {
Dog[] ds = {new Dog(1, 5), new Dog(3, 4), new Dog(2, 6)};
/**
* 按体重排序,从小到大
*/
Arrays.sort(ds, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.weight - o2.weight;
}
});
System.out.println("按体重正序排序: "+ Arrays.toString(ds));
/**
* 按身高排序,从小到大
*/
Arrays.sort(ds, (Dog o1, Dog o2) -> {
return o1.height - o2.height;
});
System.out.println("按身高正序排序: "+ Arrays.toString(ds));
/**
* 按体重加身高排序,从小到大
*/
Arrays.sort(ds, (Dog o1, Dog o2) -> (o1.weight + o1.height) - (o2.weight + o2.height));
System.out.println("按体重加身高正序排序: "+ Arrays.toString(ds));
}
}
class Dog{
public int weight;
public int height;
public Dog(int weight, int height) {
super();
this.weight = weight;
this.height = height;
}
@Override
public String toString() {
return "Dog [weight=" + weight + ", height=" + height + "]";
}
}
参考博客:https://blog.csdn.net/A1342772/article/details/91349142
产品类实现代码
interface Product {
void show();
}
class ProductA implements Product {
@Override
public void show() {
System.out.println("产品A");
}
}
class ProductB implements Product {
@Override
public void show() {
System.out.println("产品B");
}
}
简单工厂代码:
/**
* Simple Factory
* @author DELL
*
*/
public class SimpleFactory {
public Product createProductA() {
return new ProductA();
}
public Product createProductB() {
return new ProductB();
}
/**
* main方法
* @param args
*/
public static void main(String[] args) {
Product p1 = new SimpleFactory().createProductA();
p1.show();
Product p2 = new SimpleFactory().createProductB();
p2.show();
}
}
静态工厂代码:
/**
* Static Factory
* @author DELL
*
*/
public class StaticFactory {
/**
* createProduct
* @param productType
* @return
*/
public static Product createProduct(String productType) {
Product product = null;
if("A".equals(productType)) {
product = new ProductA();
}else if("B".equals(productType)) {
product = new ProductB();
}
return product;
}
/**
* main方法
* @param args
*/
public static void main(String[] args) {
Product p1 = StaticFactory.createProduct("A");
p1.show();
Product p2 = StaticFactory.createProduct("B");
p2.show();
}
}
说明:当工厂类的生产方法被声明为静态方法时,也可称之为静态工厂
简单工厂/静态工厂:将创建产品过程封装到工厂类的创建方法中。
缺点:新增产品后,需要修改工厂类的创建方法
工厂方法代码:
/**
* Factory Method
* @author DELL
*
*/
public class FactoryMethod {
/**
* main
* @param args
*/
public static void main(String[] args) {
Product p1 = new FactoryA().create();
p1.show();
Product p2 = new FactoryB().create();
p2.show();
}
}
interface Factory {
Product create();
}
class FactoryA implements Factory {
@Override
public Product create() {
return new ProductA();
}
}
class FactoryB implements Factory {
@Override
public Product create() {
return new ProductB();
}
}
说明:工厂方法将具体产品的创建推迟到子类,由具体工厂实现创建产品过程
优点:新增产品后,只需要新增对应具体工厂即可
缺点:具体产品与具体工厂耦合,创建产品时需要创建具体工厂
主要针对产品族的扩展,新增产品族时,只需要新增工厂即可
Food接口对象与Cloth接口对象组成一个产品集合,同一系列的产品成为一个产品族
/**
* Abstract Factory
* @author DELL
*
*/
public abstract class AbstractFactory {
abstract Food CreateFood();
abstract Cloth CreateCloth();
public static void main(String[] args) {
System.out.println("创建A族产品:");
AbstractFactory fA = new AFactory();
Food foodA = fA.CreateFood();
foodA.eat();
Cloth clothA = fA.CreateCloth();
clothA.use();
System.out.println("创建B族产品:");
AbstractFactory fB = new BFactory();
Food foodB = fB.CreateFood();
foodB.eat();
Cloth clothB = fB.CreateCloth();
clothB.use();
}
}
/**
* A工厂,生产A族系列产品
* @author DELL
*
*/
class AFactory extends AbstractFactory{
@Override
Food CreateFood() {
return new FoodA();
}
@Override
Cloth CreateCloth() {
return new ClothA();
}
}
/**
* B工厂,生产B族系列产品
* @author DELL
*
*/
class BFactory extends AbstractFactory{
@Override
Food CreateFood() {
return new FoodB();
}
@Override
Cloth CreateCloth() {
return new ClothB();
}
}
/**
* Food接口
* @author DELL
*
*/
interface Food{
void eat();
}
/**
* Cloth接口
* @author DELL
*
*/
interface Cloth{
void use();
}
/**
* Food A系列
* @author DELL
*
*/
class FoodA implements Food{
@Override
public void eat() {
System.out.println("A吃法");
}
}
/**
* Cloth A系列
* @author DELL
*
*/
class ClothA implements Cloth{
@Override
public void use() {
System.out.println("A用法");
}
}
/**
* Food B系列
* @author DELL
*
*/
class FoodB implements Food{
@Override
public void eat() {
System.out.println("B吃法");
}
}
/**
* Cloth B系列
* @author DELL
*
*/
class ClothB implements Cloth{
@Override
public void use() {
System.out.println("B用法");
}
}
本文地址:https://blog.csdn.net/Lyh_2015/article/details/107367213
如对本文有疑问, 点击进行留言回复!!
Flume 史上最全面的大数据学习第十篇(一) 别再说不知道flume是什么了
荐 基于 Servlet+jsp+mysql 开发 javaWeb 学生网络考试系统
网友评论