意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
类图:
此是简单工厂模式:
主要逻辑:
1.创建一个所有类的一个公共接口
2.所有具体类去实现此接口
3.创建一个和client通信的一个类,实现一个方法,返回值为接口类型
步骤 1
创建一个接口。
Shape.java
步骤 2
创建实现接口的实体类。
Rectangle.java
Square.java
Circle.java
步骤 3
创建一个工厂,生成基于给定信息的实体类的对象。
ShapeFactory.java
步骤 4
使用该工厂,通过传递类型信息来获取实体类的对象。
FactoryPatternDemo.java
步骤 5
验证输出。
抽象工厂模式:
主要逻辑:
1.抽象某几个公共的接口
2.实现他们的自己工厂
3.实现工厂抽象工厂对每个工厂进行抽象
4.实现工厂的创建
5.client去操作工厂的创建
步骤 1
为形状创建一个接口。
Shape.java
步骤 2
创建实现接口的实体类。
Rectangle.java
Square.java
Circle.java
步骤 3
为颜色创建一个接口。
Color.java
步骤4
创建实现接口的实体类。
Red.java
Green.java
Blue.java
步骤 5
为 Color 和 Shape 对象创建抽象类来获取工厂。
AbstractFactory.java
步骤 6
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
ShapeFactory.java
ColorFactory.java
步骤 7
创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
FactoryProducer.java
步骤 8
使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。
AbstractFactoryPatternDemo.java
步骤 9
验证输出。
策略模式:
定义一系列的算法, 将其一个个封装起来, 并使它们可相互替换, 使得算法可独立于使用它的客户而变化.
public class Context {
private Strategy strategy;
public void setStrategy(Type type, double... args) {
if (type == Type.NORMAL) {
strategy = new Normal();
} else if (type == Type.DISCOUNT) {
strategy = new Discount(args[0]);
} else if (type == Type.REBATE) {
strategy = new Rebate(args[0], args[1]);
}
}
public double getResult(double money) {
return strategy.acceptCash(money);
}
public enum Type {
NORMAL(0, "正常"),
DISCOUNT(1, "打折"),
REBATE(2, "返利");
private int value;
private String desc;
Type(int value, String desc) {
this.value = value;
this.desc = desc;
}
}
}
装饰模式:
1.Component,抽象方法-买手机
public abstract class AbstractBuyPhone {
//主要是向父母提出想买手机的意向
public abstract void BuyPhone();
//父母是否同意
public abstract void Agree();
}
2.ConcreteComponent:具体的意向
public class XiaoMingBuyPhone extends AbstractBuyPhone {
@Override
public void BuyPhone() {
Log.d("qzs","我想买一款华为的5000元的手机");
}
@Override
public void Agree() {
Log.d("qzs","父母同意了");
}
}
3.Decorator,增加一个装饰抽象类,方便修饰
public class XiaoMingBuyPhone extends AbstractBuyPhone {
@Override
public void BuyPhone() {
Log.d("qzs","我想买一款华为的5000元的手机");
}
@Override
public void Agree() {
Log.d("qzs","父母同意了");
}
}
3.Decorator,增加一个装饰抽象类,方便修饰
public class AbstractDecorator extends AbstractBuyPhone {
private AbstractBuyPhone abstractBuyPhone;
public AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){
this.abstractBuyPhone=abstractBuyPhone;
}
@Override
public void BuyPhone() {
this.abstractBuyPhone.BuyPhone();
}
@Override
public void Agree() {
this.abstractBuyPhone.Agree();
}
}
4.ConcreteDecorator:如果直接去找父母要手机,很容易被拒绝,所以需要修饰一下,这里用成绩修饰一下
public class ScoreDecortator extends AbstractDecorator {
public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {
super(abstractBuyPhone);
}
//先和父母说说自己的成绩
private void ShowScore(){
Log.d("qzs","我这次考试的成绩年级前三,又进步了");
}
//重写买手机的方法,先汇报成绩,然后再提买手机的事情
@Override
public void BuyPhone() {
this.ShowScore();
super.BuyPhone();
}
}
5.调用,也就是请求父母:
AbstractBuyPhone str;
//小明的原本意向
str=new XiaoMingBuyPhone();
//修饰后的意向
str=new ScoreDecortator(str);
//向父母提出想法(成绩和买手机)
str.BuyPhone();
//父母同意了
str.Agree();